package main

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"
	"time"

	"epub-go-pdf/converter"
	"epub-go-pdf/utils"
)

func main() {
	fmt.Println("EPUB转PDF工具已启动，输入文件或目录路径开始转换，输入Q退出程序")

	conv := converter.NewEPUBConverter()

	for {
		fmt.Print("请输入文件或目录路径: ")
		var input string
		fmt.Scanln(&input)

		if strings.ToUpper(input) == "Q" {
			fmt.Println("程序已退出")
			return
		}

		startTime := time.Now()

		// 检查输入路径是否存在
		info, err := os.Stat(input)
		if err != nil {
			fmt.Printf("错误: %v\n", err)
			continue
		}

		if info.IsDir() {
			// 处理目录
			err = processDirectory(input, conv)
		} else {
			// 处理单个文件
			err = processFile(input, conv)
		}

		if err != nil {
			fmt.Printf("处理失败: %v\n", err)
			continue
		}

		duration := time.Since(startTime)
		fmt.Printf("处理完成，耗时: %v\n", duration)
	}
}

func processDirectory(dirPath string, conv *converter.EPUBConverter) error {
	return filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		if !info.IsDir() && utils.IsEPUBFile(path) {
			return processFile(path, conv)
		}
		return nil
	})
}

func processFile(filePath string, conv *converter.EPUBConverter) error {
	fmt.Printf("正在处理文件: %s\n", filePath)

	// 获取输出路径
	outputPath := utils.GetOutputPath(filePath)

	// 获取输入文件大小
	inputSize, err := utils.GetFileSize(filePath)
	if err != nil {
		return fmt.Errorf("获取输入文件大小失败: %v", err)
	}

	// 确保输出目录存在
	if err := utils.EnsureDirectory(filepath.Dir(outputPath)); err != nil {
		return fmt.Errorf("创建输出目录失败: %v", err)
	}

	// 执行转换
	if err := conv.Convert(filePath, outputPath); err != nil {
		return fmt.Errorf("转换失败: %v", err)
	}

	// 获取输出文件大小
	outputSize, err := utils.GetFileSize(outputPath)
	if err != nil {
		return fmt.Errorf("获取输出文件大小失败: %v", err)
	}

	// 计算并显示压缩比
	ratio := utils.CalculateCompressionRatio(inputSize, outputSize)
	fmt.Printf("转换完成: %s -> %s\n", filePath, outputPath)
	fmt.Printf("压缩比: %.2f%%\n", ratio*100)

	return nil
}
